package com.ctl.juc;

import java.util.concurrent.*;

/**
 * <p>Title: ThreadPoolExecutors</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2019</p>
 * <p>Company: www.ctl.com</p>
 *
 * @author ctl
 * @version 1.1
 * @date 2024-07-04 09:47
 */
public class ThreadPoolExecutors {
    static int corePoolSize = 4;
    static int maximumPoolSize = 8;
    static long keepAliveTime = 60;
    static TimeUnit unit = TimeUnit.SECONDS;
    static RejectedExecutionHandler handler = new ThreadPoolExecutor.DiscardOldestPolicy();

    static BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(10000000);
    static ThreadFactory threadFactory = new CustomThreadFactory("ctl_thread_pool_1");
    public static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);

    static BlockingQueue<Runnable> workQueue1 = new LinkedBlockingQueue<>(10000000);
    static ThreadFactory threadFactory1 = new CustomThreadFactory("ctl_thread_pool_2");
    public static ThreadPoolExecutor threadPoolExecutor1 = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue1, threadFactory1, handler);

    static {
        /**
         * 核心线程将会遵循与非核心线程相同的空闲超时策略。在指定的 keepAliveTime 内如果没有新的任务到达，核心线程将会被终止。这对于资源管理非常有用，特别是在负载波动较大的应用场景中。
         * 使用场景
         * 允许核心线程在空闲时终止的配置适用于以下场景：
         *   负载波动大：在负载高峰期需要大量线程来处理任务，但是负载低谷期希望释放资源。
         *   资源受限：在资源有限的环境中，通过动态调整线程池中的线程数量来优化资源使用。
         *   任务特性：当任务到达具有突发性，并且不希望线程池长时间持有多余的核心线程。
         * 注意事项
         *   性能影响：频繁创建和销毁线程可能会带来一定的开销，视具体情况需要进行权衡。
         *   测试和监控：在生产环境部署前，建议进行充分的测试和监控，以确保这种配置对系统性能带来的影响在可接受范围内。
         * 通过这种方式，你可以灵活地管理线程池中的线程数量，确保在高并发场景下的资源利用效率，同时避免在低负载场景下的资源浪费。
         */
        // 允许核心线程在空闲时超时并终止
        threadPoolExecutor.allowCoreThreadTimeOut(true);
        // 允许核心线程在空闲时超时并终止
        threadPoolExecutor1.allowCoreThreadTimeOut(true);
    }
}
